package uy.org.softtech.cssuite.webservices.servicios;

import static org.springframework.util.Assert.notNull;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

import uy.org.softtech.cssuite.core.ServicioWeb;
import uy.org.softtech.cssuite.excepciones.EntidadNoEncontradaException;
import uy.org.softtech.cssuite.excepciones.ServicioWebException;
import uy.org.softtech.cssuite.servicios.ServiciosTareas;
import uy.org.softtech.cssuite.webservices.pedidos.ObtenerTareaRequest;
import uy.org.softtech.cssuite.webservices.respuestas.ObtenerTareaResponse;
import uy.org.softtech.cssuite.webservices.respuestas.ObtenerUsuarioResponse;

@Endpoint
public class ServiciosWebTareas extends ServicioWeb {
	
	private Logger log = Logger.getLogger(getClass());
	
	// Servicios
	@Resource(name = "servicios-tareas" )
	private ServiciosTareas serviciosTareas;

	/**
	 * Método para verificar que todos los parámetros han sido seteados correctamente.
	 * 
	 * @author fabian.lobo
	 */
	@PostConstruct
	public void initialize(){
		super.initialize();
		
		notNull(serviciosTareas(), "La propiedad [serviciosTareas] de [" + getClass().getName() + "] no ha sido establecida.");
				
		log.info("Endpoint para los servicios web relacionados con la información de las tareas programadas ha sido inicializado.");
	}
	
	/*
	 *  SERVICIOS
	 */
	/**
	 * Servicio para obtener la información de una tarea programada
	 * 
	 * @param obtenerTareaRequest - Payload del mensaje SOAP
	 * @return un elemento ObtenerUsuarioResponse con los datos del usuario
	 * @throws ServicioWebException si ocurre una excepción durante la ejecución del servicio
	 * @author fabian.lobo
	 * @see ObtenerUsuarioResponse
	 */
	@PayloadRoot(localPart = "ObtenerTareaRequest", namespace = NAMESPACE)
	@ResponsePayload
	public ObtenerTareaResponse procesarObtenerTareaRequest(@RequestPayload ObtenerTareaRequest obtenerTareaRequest) throws ServicioWebException {
		ObtenerTareaResponse respuesta = new ObtenerTareaResponse();
		try {
			respuesta.setTarea(serviciosTareas().buscarTarea(Long.valueOf(obtenerTareaRequest.getId())));
		} catch (EntidadNoEncontradaException e) {
			log.error(e);
			throw new ServicioWebException(e.getMessage());
		}
		return respuesta;
	}
	
	/*
	 *  GETTERS
	 */
	public ServiciosTareas serviciosTareas() {
		return serviciosTareas;
	}
}
